//1.

package edu.neuq.exception;
//匿名类：为函数传参——取代C++函数指针，传递不仅是数据还有方法（操作）（call back回调）
public class AgeLuncher {
	
	/*public static void fun(){
		try {
			People p=new People(-1);
			System.out.println("age is "+p.age);
		} catch (AgeException e) {//打破原有逻辑，灵活限定处理异常，分开异常的发生和处理
			// TODO 自动生成的 catch 块
			System.out.println(e.age);
		}
	}*/

	public static void main(String[] args) {
		// TODO 自动生成的方法存根

		try {
			People p=new People(-1);//数据”合法性“决定异常是否发生, 异常打破程序正常执行的流程
			System.out.println("我们创建了一个人类对象。年龄为："+p.age);
		} catch (AgeException e) {//打破原有逻辑，灵活方法内处理异常，分开异常的发生和处理
			// TODO 自动生成的 catch 块
			System.out.println("我们创建了一个人类对象失败，年龄超出合法范围:"+e.age);
		//	return;//成对出现：申请资源必须对应释放资源(内存)，否则运行时间长泄露崩溃
			//java垃圾回收机制：有new不用free的释放，虚拟机自动垃圾回收 ；除内存之外，
			//（输入/出）需要使用文件资源，用完必须释放，给其他程序使用提供空间
		//	e.printStackTrace();
			System.exit(0);//程序退出
		} finally{//finally语句块是可选的，语句块中的内容——无论是否发生异常，
			//无论是否发生return语句。finally都会被执行
			System.out.println("this is finally");
		}
		
	}

}

//2.

package edu.neuq.exception;

import java.util.Scanner;

import edu.neuq.DM.DMFrame;

public class Luncher {
	//②catching and handling exceptions
	//必选try catch block
	//可选Finally block
	
	static void funcA() {
		funcB();
		System.out.println("A");
	}
	static void funcB() {//问题逐渐向上转移（谁diaoyong）
		funcC();
		System.out.println("B");
	}
	static void funcC() {//说明该方法有可能会抛出这个异常;本质上不会解决异常
		
		try{
			
			//类可能找不到
			//初始化可能：类不允许创建实例——构造方法private——iLLEGAL ；抽象类也不允许创建实例
		//进行反射工作，需要一下三行代码，把正常的业务逻辑的代码放一起
		Class c=Class.forName("edu.neuq.W");//手动指明一个类，要求虚拟机读取字节码
		Object o=c.newInstance();//(父类)obj[自定义子类的实例]--使用上转型对象设置新创建的实例
		System.out.println(o);
		
		//分门别类的异常处理
		}catch(ClassNotFoundException e){//专门捕获ClassNotFoundException
			e.printStackTrace();
		}catch(InstantiationException e){
			e.printStackTrace();
		}catch(IllegalAccessException e){
			e.printStackTrace();
		}
		/*
		//①specifying the exceptions thrown by a method
		try {//try语句块中放入可能引发异常的代码
			Class c=Class.forName("");
		} catch (ClassNotFoundException e) {//放入处理异常的代码
			// TODO 自动生成的 catch 块
			e.printStackTrace();//异常发生的堆栈信息,发生错误仍然正常运行
		}
		*/
		System.out.println("C");
	}
	public static void main(String[] args)  {//丢给虚拟机
		//位于栈最顶端的都是main方法
		
		funcA();
		
		//可识别异常
	//	Class c=Class.forName("edu.neuq.people");
		
			
		//runTIME exception
	/*	int b;
		Scanner reader=new Scanner(System.in);
		b=reader.nextInt();
		if(b==0){//避免runoff time——严谨定义
			
		}
		int a=100/b;//输入0，在程序运行时发生
		*/
		
		
		
		
		//Errors
	//	System.out.println(Integer.MAX_VALUE);
	//	int [] a=new int[Integer.MAX_VALUE];

	}

}
